import pandas as pd
from pyecharts.charts import Line, Pie, HeatMap, Scatter, Timeline, Tab
from pyecharts import options as opts
from pyecharts.globals import ThemeType
opts.global_options.InitOpts(theme=ThemeType.LIGHT, chart_id='chart_id', bg_color='white')
#数据清洗与准备
# 1. 数据加载与清洗
df = pd.read_excel("cleal.xlsx")
# 检查缺失值
print("缺失值统计：\n", df.isnull().sum())
# 处理缺失值（示例）
df['销售额'].fillna(df['销售额'].median(), inplace=True)  # 用中位数填充缺失销售额
df['区域'].fillna('未知', inplace=True)  # 填充缺失地区
df = df.dropna(subset=['订单日期'])  # 删除日期缺失的记录
# 处理异常值（删除负销售额）
df = df[df['销售额'] > 0]
# 提取月份和季度
df['月份'] = df['订单日期'].dt.strftime('%Y-%m')
df['季度'] = df['订单日期'].dt.to_period('Q').astype(str)
#df.to_excel('cleal.xlsx', index=False, engine="openpyxl")
# 查看处理后的数据
print(df.head())

#任务1：月度销售额趋势折线图
monthly_sales = df.groupby('月份')['销售额'].sum().reset_index()
monthly_line = (
    Line()
    .add_xaxis(monthly_sales['月份'].tolist())
    .add_yaxis("销售额", monthly_sales['销售额'].round(2).tolist(),
              markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="月度销售趋势（识别销售旺季）"),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),
        yaxis_opts=opts.AxisOpts(name="销售额（元）"),
        datazoom_opts=[opts.DataZoomOpts()]  # 添加缩放功能
    )
)
monthly_line.render("月度趋势.html")

#任务2：地区销售额占比饼图
# 按地区聚合
region_sales = df.groupby('区域')['销售额'].sum().sort_values(ascending=False)
region_pie= (
    Pie()
    .add("", [list(z) for z in zip(region_sales.index, region_sales.values)],
        radius=["30%", "75%"],
        rosetype="radius")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="地区销售额占比（高贡献地区识别）"),
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%")
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(formatter="{b}: {d}%")
    )
)
region_pie.render("地区占比.html")

#任务3：产品类别-销售额热力图
heat_data = df.pivot_table(
    index="产品类别",
    columns="月份",
    values="销售额",
    aggfunc="sum"
).fillna(0)
# 生成热力图数据
heatmap_data = []
for prod in heat_data.index:
    for month in heat_data.columns:
        heatmap_data.append([month, prod, int(heat_data.loc[prod, month])])  # 注意顺序：x轴是月份，y轴是产品
# 创建热力图
heatmap = (
    HeatMap()
    .add_xaxis(heat_data.columns.tolist())  # x轴为月份
    .add_yaxis(
        "销售额",
        heat_data.index.tolist(),            # y轴为产品类别
        heatmap_data,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="产品类别月度热力图"),
        visualmap_opts=opts.VisualMapOpts(max_=heat_data.max().max())
    )
)
heatmap.render("品类热力.html")

#任务4：动态仪表盘（季度变化）
# 按季度创建时间轴
timeline = Timeline()
for quarter in sorted(df['季度'].unique()):
    quarter_data = df[df['季度'] == quarter]
    # 每个季度的地区占比饼图
    pie = (
        Pie()
        .add("", [list(z) for z in zip(
            quarter_data.groupby('区域')['销售额'].sum().index,
            quarter_data.groupby('区域')['销售额'].sum().values
        )])
        .set_global_opts(title_opts=opts.TitleOpts(title=f"{quarter}地区占比"))
    )
    timeline.add(pie, quarter)
timeline.render("季度变化.html")

#任务5：客户购买频率-金额分布散点图
# 计算每个客户的RFM指标
rfm = df.groupby('顾客姓名').agg({
    '订单日期': lambda x: (pd.to_datetime('today') - x.max()).days,  # Recency
    '订单号': 'count',  # Frequency
    '销售额': 'sum'  # Monetary
}).rename(columns={'订单日期': 'R', '订单号': 'F', '销售额': 'M'})
# 标准化数据（0-1范围）
rfm_scaled = (rfm - rfm.min()) / (rfm.max() - rfm.min())
 #任务5：客户购买频率-金额分布散点图（修正版）
rfm_scatter = (
    Scatter()
    .add_xaxis(rfm_scaled['F'].tolist())
    .add_yaxis(
        "客户价值",
        rfm_scaled['M'].tolist(),
        symbol_size=10,
        label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="客户购买频率-金额分布"),
        xaxis_opts=opts.AxisOpts(name="购买频率（标准化）"),
        yaxis_opts=opts.AxisOpts(name="消费金额（标准化）"),
        tooltip_opts=opts.TooltipOpts(
            formatter="""
            function(params) {
                return '顾客姓名: ' + rfm.index[params.dataIndex] + 
                       '<br/>频率: ' + rfm['F'].iloc[params.dataIndex] + 
                       '<br/>金额: ' + rfm['M'].iloc[params.dataIndex].toFixed(2);
            }
            """
        )
    )
)

rfm_scatter.render("客户分布.html")

tab = Tab()
tab.add(monthly_line, "月度趋势")
tab.add(region_pie, "地区占比")
tab.add(heatmap, "品类热力")
tab.add(timeline, "季度变化")
tab.add(rfm_scatter, "客户分布")
tab.render("汇总效果图.html")